#pragma once
#include <iostream>
#include <string>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <vector>

#include "InetAddr.hpp"
#include "Log.hpp"

/*------------ 网络路由到用户 ---------------*/
using namespace LogModule;

class Routee
{
private:
    bool IsExist(InetAddr &peer)
    {
        for (auto &user : _online_user)
        {
            if (user == peer)
                return true;
        }
        return false;
    }

    void AddUser(InetAddr &peer)
    {
        LOG(LogLevel::INFO) << "新增一个在线用户: " << peer.StringAddr();
        _online_user.push_back(peer);
    }

    void DeletUser(InetAddr &peer)
    {
        for(auto itear = _online_user.begin(); itear != _online_user.end(); itear++)
        {
            /*
                *itear  ->  InetAddr对象
                itear   ->  std::vector<InetAddr>::itear
            */
            if(*itear == peer)
            {
                LOG(LogLevel::INFO) << "删除一个用户: " << peer.StringAddr();
                //erase删除的逻辑是通过迭代器查找删除元素
                _online_user.erase(itear);
                break;
            }
        }
    }

public:
    void MessageRoute(int sockfd, const std::string &message, InetAddr &peer)
    {
        // 1、判断发送数据的用户是否存在于 _online_user
        // 1.1 不存在(第一次发送数据相当于注册，往online_user进行写入方便管理)
        if (!IsExist(peer))
        {
            AddUser(peer);
        }
        // 1.2 存在(把数据路由到网络,发送给所以用户看到 -> 群聊)
        for (auto &user : _online_user)
        {
            sendto(sockfd, message.c_str(), message.size(), 0, (struct sockaddr *)&peer, sizeof(peer));
        }
        //如果用户发送 QUIT表示退出
        if(message == "QUIT")
        {
            DeletUser(peer);
        }
    }

private:
    std::vector<InetAddr> _online_user; // 在线用户
};